﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Galaxy.Portal.Service
{
    /// <summary>Известная система</summary>
    [Serializable]
    class CKnownGalaxy
    {
        /* -------------------------------------------------------------------------- */

        /// <summary>Название системы</summary>
        private string f_Name;
        /// <summary>Путь размещения</summary>
        private string f_Patch;
        /// <summary>Порт</summary>
        private int f_Port;

        /* -------------------------------------------------------------------------- */

        /// <summary>Название системы</summary>
        public string Name { get { return f_Name; } set { f_Name = value; } }
        /// <summary>Путь</summary>
        public string Patch { get { return f_Patch; } set { f_Patch = value; } }
        /// <summary>Порт</summary>
        public int Port { get { return f_Port; } set { f_Port = value; } }

        /// <summary>Новая известная система</summary>
        public CKnownGalaxy() { }

        /// <summary>Новая известная система</summary>        
        /// <param name="Name">Назнвание системы</param>
        /// <param name="Patch">Размещение</param>
        /// <param name="Port">Порт</param>
        public CKnownGalaxy(string Name, string Patch, int Port)
        {
            f_Name = Name;
            f_Patch = Patch;
            f_Port = Port;
        }

        /* -------------------------------------------------------------------------- */

        /// <summary>Строковый эквивалент</summary>
        /// <returns>Значение</returns>
        public override string ToString()
        {
            return Name + " - " + Patch + ":" + Port.ToString();
        }

        /// <summary>ХЭШ-код</summary>
        /// <returns>ХЭШ-код</returns>
        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }

        /// <summary>Проверка на эквивалентность объекту</summary>
        /// <param name="obj">Проверяемый объект</param>
        /// <returns>Истина, если объект - информация о размещении системы</returns>
        public override bool Equals(object obj)
        {
            if(obj.GetType() == this.GetType()) return obj.GetHashCode() == this.GetHashCode();
            return base.Equals(obj);
        }


        /* -------------------------------------------------------------------------- */
    }

    /// <summary>Список известных систем</summary>
    [Serializable]
    class CKnownGalaxyList : List<CKnownGalaxy>
    {
        /// <summary>Сериализация списка известных систем в двоичный файл</summary>
        /// <param name="FilaName">Имя файла</param>
        public void SerializeBinary(string FileName)
        {
            using(FileStream DataFile = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.Write))
                SerializeBinary(DataFile);
        }

        /// <summary>Сериализация списка известных систем в формате XML</summary>
        /// <param name="FileName">Имя файла</param>
        public void SerialixeXML(string FileName)
        {
            using(FileStream DataFile = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.Write))
                SerializeXML(DataFile);
        }

        /// <summary>Сериализация списка известных систем в поток в двоичном виде</summary>
        /// <param name="DataStream">Поток данных</param>
        public void SerializeBinary(Stream DataStream)
        {
            new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter().Serialize(
                DataStream, this);
        }

        /// <summary>Сериализация списка известных систем в поток данных в формате XML</summary>
        /// <param name="DataStream">Поток данных</param>
        public void SerializeXML(Stream DataStream)
        {
            new System.Xml.Serialization.XmlSerializer(this.GetType()).Serialize(DataStream, this);
        }

        /// <summary>Десериализация списка известных систем в файл в двоичном формате</summary>
        /// <param name="FileName">Имя файла</param>
        /// <returns>Список известных систем</returns>
        public static CKnownGalaxyList DeserializeBinary(string FileName)
        {
            using(FileStream DataFile = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                return DeserializeBinary(DataFile);
        }

        /// <summary>Десериализация списка известных систем из файла в формате XML</summary>
        /// <param name="FileName">Имя файла</param>
        /// <returns>Список известных систем</returns>
        public static CKnownGalaxyList DeserializeXML(string FileName)
        {
            using(FileStream DataFile = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                return DeserializeXML(DataFile);
        }

        /// <summary>Десериализация списка известных систем из двоичного потока данных</summary>
        /// <param name="DataStream">Поток данных</param>
        /// <returns>Список известных систем</returns>
        public static CKnownGalaxyList DeserializeBinary(Stream DataStream)
        {
            return new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter().Deserialize(
                DataStream) as CKnownGalaxyList;
        }

        /// <summary>Десериализация списка известных систем из потока XML</summary>
        /// <param name="DataStream">Поток данных</param>
        /// <returns>Список известных систем</returns>
        public static CKnownGalaxyList DeserializeXML(Stream DataStream)
        {
            return new System.Xml.Serialization.XmlSerializer(typeof(CKnownGalaxyList)).Deserialize(
                DataStream) as CKnownGalaxyList;
        }

    }
}
